package com.yc154.util;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.Map;
@Component
public class JwtUtils {
    /**
     * 签名用的密钥, 需要统一生成和管理密码
     */
    private static final String SIGNING_KEY =
            "123456789qqewrqerqerwqerw123456789qqewrqerqerwqerw123456789qqewrqerqerwqerw";
    /**
     * 用户登录成功后生成Jwt
     * 使用Hs256算法
     *
     * @param expMinutes jwt过期时间, 单位： 分钟
     * @param claims 保存在Payload（有效载荷）中的内容
     * @return token字符串
     */
    public static String createJWT(int expMinutes, Map<String,Object> claims) {
        //指定签名的时候使用的签名算法
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        //生成JWT的时间
        long nowMillis = System.currentTimeMillis();
        Date now = new Date(nowMillis);
        Date exp = new Date(nowMillis + expMinutes * 1000 * 60);
        //创建一个JwtBuilder，设置jwt的body
        JwtBuilder builder = Jwts.builder()
                //保存在Payload（有效载荷）中的内容
                .setClaims(claims)
                //iat: jwt的签发时间
                .setIssuedAt(now)
                //设置过期时间
                .setExpiration(exp)
                //设置签名使用的签名算法和签名使用的秘钥
                .signWith(signatureAlgorithm, SIGNING_KEY);
        return builder.compact();
    }
    /**
     * 解析token，获取到Payload（有效载荷）中的内容，包括验证签名，判断是否过期
     */
    public static Claims parseJWT(String token) {
        //得到DefaultJwtParser
        Claims claims = Jwts.parser()
                //设置签名的秘钥
                .setSigningKey(SIGNING_KEY)
                //设置需要解析的token
                .build()
                .parseClaimsJws(token)
                .getBody();
        return claims;
    }

    public static void main(String[] args) {
        String jwt = "eyJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjEsInBob25lIjoiMTMyODM3MTg2MDAiLCJzZXgiOiLnlLciLCJuYW1lIjoi5oKf56m6Iiwic3RhdGUiOjEsImFkZHIiOiLlpKnlrZDohJrkuIsiLCJlbWFpbCI6InNvbmdAZm94bWFpbC5jb20iLCJ1c2VybmFtZSI6Ind3IiwiaWF0IjoxNzYyMDcwNjg0LCJleHAiOjE3NjIwNzI0ODR9.WXwhVGtot9C4l0J9BijJ5KcFc75Ne_BTFYDEuu1AGKc";
        System.out.println(jwt);
        Claims claims = parseJWT(jwt);
        System.out.println(claims);
    }


}